S3コンソールからバッチオペレーションジョブでオブジェクトのコピーと復元を実行する
データアナリティクス事業本部 機械学習チームの鈴木です。
S3のライフサイクルでオブジェクトクラスを変更するライフサイクルポリシーを設定しているときに、複数のファイルを標準クラスに戻したり復元したりするのってどうするのがいいんだろうと思っていましたが、S3バッチオペレーションジョブを使えばできそうなことを知りました。
この機能はre:Invent 2018期間中に発表されたもので、今となっては歴史も長い機能ですが、私はたまたま使う機会がなかったため、まずはS3コンソールから使ってみました。
バッチオペレーションジョブについて
Amazon S3オブジェクトに対して大規模なバッチオペレーションを実行するための機能です。
ユーザーはCSVやS3インベントリで生成されるJSONレポート形式のマニフェストファイルを準備し、マニフェストファイルに記載のオブジェクトに対してオペレーションを実行することができます。
バッチオペレーションジョブはオブジェクトに対して操作を行うため、その権限を付与したIAMロールを準備する必要があります。
多数のオペレーションをサポートしており、記事執筆時点では以下がありました。
- オブジェクトのコピー
- AWS Lambda 関数の呼び出し
- すべてのオブジェクトタグを置換する
- すべてのオブジェクトタグを削除する
- アクセスコントロールリストを置き換える
- バッチオペレーションを使ってオブジェクトを復元する
- S3 オブジェクトロックの保持
- S3 オブジェクトロックのリーガルホールド
- S3 バッチレプリケーションを使用した既存のオブジェクトのレプリケーション
準備
まずは検証のための準備について記載します。
オブジェクトのアップロード
検証用のS3バケットに、2つだけですがオブジェクトをアップロードしておきました。
パスはbatch_operation/source/test1.txt
のように配置しました。パスはなんでもよいのですが、マニフェストファイルと、後で行うコピー結果に現れるので明記しておきます。
マニフェストファイルの作成
今回は手でCSV形式のマニフェストファイルを作成しました。バケット名
は自身のものに置き換えてください。
バケット名,batch_operation/source/test1.txt バケット名,batch_operation/source/test2.txt
CSVを手作りする場合、マニフェストファイルは2または3列になります。上記の例は3列目がありませんが、オペレーション対象がバージョニングされている場合に、バージョンIDを指定するために使います。バージョンIDが指定されていない場合は、最新バージョンに対して処理が実行されるそうです。
このファイルをS3バケットにアップロードしておきました。
パスはバッチオペレーションジョブで後ほど指定します。
マニフェストファイルはS3インベントリレポートを使用することもできます。また、S3コンソール以外からであれば、オブジェクトフィルター条件に基づいてマニフェストを自動的に生成させることもできるようです。
IAMロールの作成
バッチオペレーションジョブがオペレーション実行対象のオブジェクトや結果、マニフェストファイルにアクセスできるよう、IAMロールを作成しておく必要がありました。
今回はコピーと復元を試してみたかったので、以下の2つのIAMポリシーを作成しました。
コピー用のポリシー
以下の定義でIAMポリシーを作成しました。
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "s3:PutObject", "s3:PutObjectAcl", "s3:PutObjectTagging" ], "Effect": "Allow", "Resource": "arn:aws:s3:::コピー先のS3バケット/*" }, { "Action": [ "s3:GetObject", "s3:GetObjectAcl", "s3:GetObjectTagging", "s3:ListBucket" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::コピー対象のオブジェクトがあるS3バケット", "arn:aws:s3:::コピー対象のオブジェクトがあるS3バケット/*" ] }, { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:GetObjectVersion" ], "Resource": [ "arn:aws:s3:::マニフェストファイルがあるS3バケット/*" ] }, { "Effect": "Allow", "Action": [ "s3:PutObject" ], "Resource": [ "arn:aws:s3:::レポートを配置するS3バケット/*" ] } ] }
復元用のポリシー
以下の定義でIAMポリシーを作成しました。
{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":[ "s3:RestoreObject" ], "Resource": "arn:aws:s3:::復元対象のオブジェクトがあるS3バケット/*" }, { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:GetObjectVersion" ], "Resource": [ "arn:aws:s3:::マニフェストファイルがあるS3バケット/*" ] }, { "Effect":"Allow", "Action":[ "s3:PutObject" ], "Resource":[ "arn:aws:s3:::レポートを配置するS3バケット/*" ] } ] }
上記は、以下のガイドの記載と同じです。ほかのオペレーションについてもポリシー定義のサンプルがあるのでご確認ください。
次に、IAMロールを作成しました。今回はマネジメントコンソールから作成しました。
IAMのコンソールよりロールを作成
からIAMロールを作成しました。
信頼されたエンティティを選択
ではユースケースとしてS3を選択すると、S3 Batch Operations
があるのでこちらを選択しました。
先に作成したIAMポリシーを設定し、cm-nayuts-batch-oparation-role
という名前でロールを作成しました。
このとき、信頼ポリシーは以下のようになっており、Principalでbatchoperations.s3.amazonaws.com
が指定されていることに注意するとよさそうでした。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "batchoperations.s3.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
コピーの実行
まずはシンプルにオブジェクトのコピーをやってみました。
1. ジョブの作成
S3コンソールの左メニューからバッチオペレーション
を選択し、ジョブの作成
を押しました。
マニフェストファイルを選択する画面になるので、CSV形式を選び、マニフェストファイルのパスを指定しました。
次の画面でオペレーションを選択しました。
以下の画像にあるように、かなり多くのオペレーションがサポートされていました。
コピー時にはストレージクラスが選択できるので、一括のアーカイブなどにも使えそうでした。今回は単にコピーしてみたいだけなので、スタンダードを選びました。
コピー先のバケットを指定しました。同じ名前の既存のオブジェクトは上書きされます
は問題なかったのでチェックを入れておきました。
追加オプションとして、デフォルト以外にしたいものを設定をしました。
完了レポートは中身に関心があったので生成するようにしてみました。レポートの送信先はIAMロールが書き込める場所にしました。
アクセス許可では、作成していたIAMロールを指定しました。
これでバッチオペレーションの作成は終わりです。
2. ジョブの実行
バッチオペレーション画面でしばらく待つと、実行のための確認待ち
にステータスが遷移するので、実行したいジョブを選択してジョブを実行
を押しました。
完了済みになるのを待ちました。
3. コピー結果の確認
以下のようにコピーが作成されていました。オブジェクトが作成されるパスは、ジョブに設定した送信先の下にマニフェストファイルのキーが作成されるようだったので、少し注意が必要そうでした。
完了レポートも指定した場所にできていました。
バケット名,batch_operation/source/test1.txt,,succeeded,200,,Successful バケット名,batch_operation/source/test2.txt,,succeeded,200,,Successful
コピーの実行(異なるストレージクラスへ)
標準 - IAからスタンダードへのコピー
コピーの際にストレージクラスが選択できたので、標準 - IA
からスタンダードクラスへのコピーも試してみました。
まずオブジェクトを標準 - IAへ設定しておきました。
続いて、先ほどと同じようにコピーのジョブを実行しました。コピーの際、ストレージクラスはスタンダード
を選びました。
実行すると、以下のようにコピーできました。
アーカイブの復元
Glacierからの復元
以下のように、Glacier Flexible Retreval
へアーカイブしたオブジェクトを用意しました。
コピーと同様にジョブを作成しますが、オペレーションは復元
にしました。このとき、どのストレージクラスからかと復元されたコピーが利用可能な日数、取得階層を設定できました。
ジョブを実行すると、アーカイブしたオブジェクトに対して確かに復元が行われたことを確認できました。
最後に
今回はS3コンソールからのバッチオペレーションジョブの実行の仕方についてでした。オブジェクトのコピーと復元を紹介しました。
複数のオブジェクトに対して一気に処理が実行できたのでとても便利でした。
マニフェストファイルについては、S3インベントリでレポートという形で生成できるので、こちらについてもまた試してみたいなと思いました。
また、コンソール以外からであれば、プレフィクス指定で自動で生成もできるようだったので、使いこなせるとよさそうでした。
参考になりましたら幸いです。